package modelo;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.TreeMap;

public class OrdenDAO {
	private TreeMap<Integer, Orden> elementos = new TreeMap<Integer, Orden>();

	public OrdenDAO() {
		super();
	}
	
	public void cargar() {
		ArrayList<Orden> arr = Datos.getInstancia().leerBaseDatos("orden", new CreadorDato<Orden>() {
			@Override
			public Orden crear(ResultSet rs) throws SQLException {
				return new Orden(rs.getInt("codigo"), rs.getString("cliente"), rs.getDouble("total"));
			}
		});
		
		for (Orden or : arr)
			elementos.put(or.getCodigo(), or);
	}

	public Orden anadir(String cliente, double total) {
		try {
			ResultSet rs = Conexion.consultar("INSERT INTO orden (cliente, total) VALUES ('" + cliente + "', " + total + ") RETURNING codigo;");
			if (rs.next()) {
				Orden or = new Orden(rs.getInt("codigo"), cliente, total); 
				elementos.put(or.getCodigo(), or);
				return or;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	public void actualizar(Orden or) {
		String cadena = "UPDATE orden SET cliente = '" + or.getCliente() + "', precio = " + or.getTotal() + " WHERE codigo = " + or.getCodigo();
		Conexion.ejecutar(cadena);
	}
	
	public void eliminar(int codigo) {
		String cadena = "DELETE FROM orden WHERE codigo = " + codigo;
		Conexion.ejecutar(cadena);
		elementos.remove(codigo);
	}
	
	public Orden buscar(int codigo) {
		return elementos.get(codigo);
	}
	
	public ArrayList<Orden> ordenesGeneral() {
		return adjuntarObjeto(Conexion.consultar("SELECT codigo FROM orden"));
	}
	
	public ArrayList<Orden> ordenesPorProducto(int producto) {
		return adjuntarObjeto(Conexion.consultar("SELECT orden AS codigo FROM detalle_orden WHERE producto = " + producto));
	}
	
	private ArrayList<Orden> adjuntarObjeto(ResultSet rs) {
		ArrayList<Orden> lst = new ArrayList<Orden>();
		
		try {
			while (rs.next()) lst.add(elementos.get(rs.getInt("codigo")));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return lst;
	}
}
